<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>

function Foo(){
    getName = function (){alert(5)};
    return this;
}
Foo.getName = function (){alert(4)};
Foo.prototype.getName = function (){alert(3)}
var getName = function (){alert(2)};
function getName(){alert(1)};

/* // 以上代码预解析之后：
function Foo(){
    getName = function (){alert(5)};
    return this;
}
// var getName; 变量和函数重名时，函数优先
function getName(){alert(1)};
Foo.getName = function (){alert(4)};
Foo.prototype.getName = function (){alert(3)}
getName = function (){alert(2)}; */

// 请写出下列程序执行的结果？
Foo.getName();// 4
getName();// 2
Foo().getName();// 5 先执行Foo() => window.getName()
getName();//5
new Foo.getName();// 4 先执行(Foo.getName) -> fn，然后再 new fn()
new Foo().getName();// 3 先执行 new Foo() -> Foo的实例对象.getName()
new new Foo().getName();// 3 先执行 new Foo() -> new Foo的实例对象.getName() -> 先执行(Foo的实例对象.getName) -> fn2，然后 new fn2()

</script>
</body>
</html>